/******************************************************************************/
/* @ All Rights Reserved Copyright (C) 2014 broada,Ltd.                       */
/*                                                                            */
/*  NAME      = kafka_core.h                                                  */
/*  NOTE      =                                                               */
/*  DATE      = 2014/09/28 by zhengxd                                         */
/******************************************************************************/
#ifndef _KAFKA_CORE_H_
#define _KAFKA_CORE_H_

#include "kafka_base_type.h"

/*
 *  分片包数据
*/
typedef struct __st_L7_fragment_kafka {

    int i_req_resp;                         /* 数据类型 */
    unsigned int ui_total_len;
    unsigned int ui_remain_len;
    Frbyte_Packet *p_st_data;
    struct timeval st_start_timestamp;     /* 开始分片包的时间 */
    struct timeval st_end_timestamp;       /* 结束分片包的时间 */
} L7_fragment_kafka;

/*
 *  kafka请求
 *  对应L7_requestdata中的p_request_private数据
*/
typedef struct __st_L7_req_kafka {

    int i_need_response;
    int i_req_type;
    int i_report_type;
    unsigned long ul_request_bytes;
    unsigned long ul_send_time_us;
    unsigned long ul_req_sequence;
    struct timeval st_start_timestamp;     /* 开始分片包的时间 */
    struct timeval st_end_timestamp;       /* 结束分片包的时间 */
    Frlist_header st_topics;                /* Kafka_topic_req_info */
} L7_req_kafka;

/*
 *  kafka响应
 *  解析response过程中的数据
*/
typedef struct __st_L7_resp_kafka {

    Frlist_header st_topics;                /* Kafka_topic_req_info */
}L7_resp_kafka;

/*
 *  kafka私有数据
*/
typedef struct __st_L7session_kafka_private {

    int i_version;                          /* 版本信息 */
    int i_msg_version;                      /* 版本信息 */
    L7_fragment_kafka *p_st_fragment;       /* 分片包数据 */
    L7_req_kafka *p_st_req;                 /* request数据 */
    L7_resp_kafka *p_st_resp;               /* response信息 */
} L7session_kafka_private;

int kafka_detect(Conntrack *p_st_conn, Apm_packet *p_st_packet);

int kafka_analysis(Conntrack *p_st_conn
                 , Apm_packet *p_st_packet
                 , Frhash_header *p_st_hash_report);

int kafka_session_destroy(void *p_private_session);


#endif
